<script type="text/javascript">
    //在try里面的发生错误，不会执行错误后的try里面的代码，但执行后续的代码
    try{
        console.log('a');
        console.log(b);
        console.log('c');//c不执行
    }catch(e){//error error.message error.name ---> error,e是系统给的错误信息
        console.log(e.name + ":" + e.message);
    }
    console.log('d');//依然执行d
</script>

<script type="text/javascript">
    //ES5.0的严格模式 启动
    'use strict';//写在逻辑最前面为了启动全局的ES5.0的严格模式,ES3.0的部分方法就不能用，其中一个方法就是arguments.callee;为什么写在最前端，是规定，要写在页面逻辑的最顶端，ES5.0能用正常模式，发生冲突用ES3.0.
    function test(){
        console.log(arguments.callee);
    }
    test();
</script>

<script type="text/javascript">
    function demo(){//ES3.0 的标准规则  
        console.log(arguments.callee);
    }
    demo();

    function test(){
        //函数执行ES5.0的严格模式 写到局部的函数里面
        'use strict';
        console.log(arguments.callee);
    }

    test();
</script>

'use strict' 为什么用字符串，兼容老浏览器，如果用函数，老浏览器没有ES5导致报错后面函数执行不了；向后兼容，老浏览器保证不报错，新浏览器保证被识别
不在兼容ES3的一些不规则语法，使用全新的ES6规范

两种用法
全局的严格模式     写在全局的最顶端
局部函数内严格模式

<script type="text/javascript">
    var obj = {
        name : 'obj'
    }

    var name  = 'window';

    function test(){
        var name = 'scope';
        with(obj){//with可以改变作用域链，可以让里面的代码，代码的作用域链的最顶端，变成with括号里面的对象，obj充当里面的最直接的AO
            console.log(name);
        }
    }

    test();
</script>

<script type="text/javascript">
    var org = {
        dp1 : {
            ao : {
                age : 20,
                sex : 'male'
            },
            bo : {
                age : 18,
                sex : 'male'
            }
        },
        dp2 : {
        }
    }

    with(org.dp1.jc){
        console.log(name);//命名空间的用法 ：直接用变量名，找的最直接的AO是with里的对象，达到代码简化的目的，命名空间的用法。 
    }

    document{
        write : function(){}
    }

    with(document){
        write('a');//在AO里面找write,AO是document，AO里拿函数，document里面拿
    }

    //with 更改作用域链，作用域链是经过很复杂的一个过程生成的，更改需要系统内核消耗大量效率，把程序变得非常慢，把原来的作用域链强加一个作用域链，改系统内部的东西太深。如果作用域链有10层，改了相当于新加一层，改了十次


</script>

<script type="text/javascript">
    //ES5的严格模式不用with

    'use strict';

    function test(){
        console.log(arguments.callee);
    }
    test();
</script>

<script type="text/javascript">
    'use script';

    function test(){
        console.log(test.caller);
    }

    function demo(){
        test();
    }

    demo();
</script>

<script type="text/javascript">
    'use strict';
    function test(){
        console.log(this);//返回this对象，表明构造函数能生成对象，打印test(),test是该对象的constructor名
    }

    new test();//new的话是新对象，不new 就是undefined
//预编译时this不再指向window

    //this必须赋值，或者test.call({})，ES5下this在预编译环节，不再指向window，没有指向，空

    test.call({});//空对象
    test.call(123);// this必须赋值，赋什么就是什么，把this变成123就是123
</script>

<script type="text/javascript">
    function test(){
        console.log(this);
    }
    test.call(123);//不能传原始值，传原始值包装成包装类；改变this指向可以，不能传原始值，传原始值包装；严格模式传啥就是啥
</script>

<script type="text/javascript">
    'use script';
    console.log(this);//全局模式下，this指向window
</script>

重复的参数在ES5里不行
<script type="text/javascript">
    //ES3里不报错,重复参数在ES5里报错
    'use script';
    function test(name,name){
        console.log(name);
    }
    test(1,2);

    //重复属性不报错
    var obj = {
        name : '123',
        name : '223'
    }//浏览器规定语法与实现语法之间的误差

    eval('');//eval里能把字符串当作代码来执行，eval 在es3不能用
</script>

//'use strict' 不在兼容ES3的一些不规则语法。使用全新的ES5规范
两种方法
全局严格模式
局部函数内严格模式

不支持with,arguments.callee,func.caller,变量赋值前必须声明，局部this必须被赋值（Person.call(null/undefined)),赋值什么就是什么，拒绝重复属性和参数